// Package model 定义了所有的数据模型。
package model

import (
	"gorm.io/gorm"
)

// User 表示系统中的用户，包含用户名、密码、用户信息和用户等级
type User struct {
	gorm.Model
	Username string `gorm:"unique;not null" json:"username,omitempty" binding:"required,min=3,max=20"` // 用户名，唯一且不能为空
	Password string `gorm:"not null" json:"password,omitempty" binding:"required,min=6"`
	UserInfo
	UserLevel
	Posts    []Post    `gorm:"foreignKey:AuthorID" json:"posts,omitempty"`
	Comments []Comment `gorm:"foreignKey:UserID" json:"comments,omitempty"` // 关联到 Comment
}

// UserInfo 是用户的基本信息
type UserInfo struct {
	Avatar    string `json:"avatar,omitempty"`
	Birthday  string `json:"birthday,omitempty"` // 示例：2024-05-23
	Gender    string `json:"gender,omitempty"`   // 任意字符串
	Signature string `gorm:"size:255" json:"signature,omitempty"`
}

// UserLevel 是用户的等级相关信息
// Level 分为四级，用 1~4 的整数表示, 等级 4 为 super user， 只能直接修改数据库设置
// Exp   每级所需的经验分别为：20、30, 等级四无法通过经验升级
type UserLevel struct {
	Level uint8 `gorm:"not null;default:1" json:"level"`
	Exp   uint8 `gorm:"not null;default:0" json:"exp"`
}

// CheckIn 按照给定的经验规则更新经验并返回一个 UserLevel
// Level 分为四级，用 1~4 的整数表示, 等级 4 为 super user， 只能直接修改数据库设置
// Exp   每级所需的经验分别为：20、30, 等级四无法通过经验升级
func (ul *UserLevel) CheckIn() UserLevel {
	ul.Exp += 3
	switch ul.Level {
	case 1:
		if ul.Exp >= 20 {
			ul.Level = 2
			ul.Exp = ul.Exp - 20
		}
	case 2:
		if ul.Exp >= 30 {
			ul.Level = 3
			ul.Exp = ul.Exp - 30
		}
	}

	return *ul
}
